package JBD.Projet_Audacity;
import java.io.*;
import java.util.ArrayList;


public class Canal{
	private ArrayList<Integer> mesEchantillons;
	//private Fragment mesEchantillons;
	private int nbechant, dataout; 
	
/**************************** Constructeur de Canal *********************************/
	/*Canal(long size){
		//tabEchantillon = new int[(int)size];
		//mesEchantillons = new ArrayList<Integer>((int)size);
		mesEchantillons = new ArrayList<Integer>();
		//mesEchantillons = new Fragment();
		clear();
	}*/
	
	Canal(){
		mesEchantillons = new ArrayList<Integer>();
		//mesEchantillons = new Fragment();
		clear();
	}

/***************************** Méthodes d'initialisation du Canal *****************************************/
	//initialise le canal à 0
	void clear(){
		nbechant=0;
		initLecture();
	}
	
	//initialise la lecture à 0
	void initLecture(){
		dataout=0;
	}
	
/***************************** AJOUT **************************************************/
	//Ajoute l'échantillon à la suite des autres (à 0 si vide)
	void addEchant(int ech){
		mesEchantillons.add(nbechant, ech);
		nbechant++;
	}

/****************************** COPIE ***********************************************/
	//Copier puis renvoie un fragment de canal
	ArrayList<Integer> copierEchant(int debut, int fin){
		ArrayList<Integer> copier = new ArrayList<Integer>();
		if(debut<fin){
			int i = fin-debut;
			for(int j=0; j<i;j++)
				copier.add(j, mesEchantillons.get(debut+j));
		}
		return copier;
	}
	
/****************************** COUPER ***********************************************/
	ArrayList<Integer> couperEchant(int debut, int fin){
		ArrayList<Integer> copier = new ArrayList<Integer>();
		if(debut<fin){
			int i = fin-debut;
			for(int j=0; j<i;j++)
				copier.add(j, mesEchantillons.get(debut+j));
		}
		removeEchant(debut,fin);
		return copier;
	}	
	
	
/****************************** INSERER ***********************************************/
	//ajoute un fragment de canal passé en paramètre à l'endroit spécifié (variable debut)
	void insererEchant(ArrayList<Integer> ajout, int debut){
			mesEchantillons.addAll(debut, ajout);
			nbechant=nbechant+ajout.size();
	}
	//Supprime un fragment de canal pour le remplacer par le fragment passé en paramètre à l'endroit spécifié (variable debut)
	//Si le fragment à ajouter dépasse la longueur du canal, on agrandit le canal pour fair el'ajout
	
/****************************** REMPLACER ***********************************************/
	void remplacerEchant(ArrayList<Integer> ajout, int debut){
		int i =(mesEchantillons.size()-debut);
		int j = ajout.size();
		System.out.println("mesechant.size : "+i+" ajout.size : "+j);
		
		if(j<i){
			removeEchant(debut, debut+j);
			mesEchantillons.addAll(debut, ajout);
		}
		else{
			removeEchant(debut, mesEchantillons.size());
			mesEchantillons.addAll(debut, ajout);
			nbechant = nbechant+(j-i);
		}
}
		
	
/****************************** SUPPRIMER ***********************************************/
	//Supprime un fragment de canal de l'index oudebut à oufin
	void removeEchant(int oudebut, int oufin){
		if(oudebut<oufin){
			mesEchantillons.subList(oudebut, oufin).clear();
			nbechant=nbechant-(oufin-oudebut);
		}
		
	}
	
/******************************* FUSION ********************************************/
	//Renvoie la somme du canal actuel avec le canal passé en paramètre
	//Permet la lecture de 2 canaux simultanément
	Canal fusion(Canal c){
		Canal union= new Canal();
		//ArrayList<Integer> unionEchant = new ArrayList<Integer>();
		initLecture();
		c.initLecture();
		union.initLecture();
		int i =0;
		System.out.println("nbechant : " + nbechant + " c.nbechant : " + c.nbechant);
		if(nbechant<=c.nbechant){
			while(i<nbechant){
				//unionEchant.add(i, getmesEchantillons(i)+c.getmesEchantillons(i));
				union.addEchant(getmesEchantillons(i)+c.getmesEchantillons(i));
				i++;
			} 
			while(i<c.nbechant){
				//unionEchant.add(i, c.getmesEchantillons(i));
				union.addEchant(c.getmesEchantillons(i));
				i++;
			} 
		}
		else{
			while(i<c.nbechant){
				//unionEchant.add(i, getmesEchantillons(i)+c.getmesEchantillons(i));
				union.addEchant(getmesEchantillons(i)+c.getmesEchantillons(i));
				i++;
			} 
			while(i<nbechant){
				//unionEchant.add(i, getmesEchantillons(i));
				union.addEchant(getmesEchantillons(i));
				i++;
			} 
		}
		//union.remplacerEchant(unionEchant, 0);
		System.out.println("union.nbechant : " + union.getnbEchant());
		return union;
	}
	
	
	
	
	
	
/*********************************** Accesseurs ****************************************************/
	//Renvoie le nombre d'échantillons contenus dans le canal
	int getnbEchant(){
		return nbechant;
	}
	
	//Renvoie l'échantillon pointé par dataout
	int getEchant(){
		int resultat=0;
		if(dataout<nbechant){
			resultat = getmesEchantillons(dataout);
			dataout++;
		}
		return resultat;	
	}

	//Renvoie l'échantillon situé à l'index i
	int getmesEchantillons(int i){
		return mesEchantillons.get(i);
	}


	boolean estVide(){
		if(nbechant==0)
			return true;
		return false;
	}
	
	
}
	